package com.gomoku.common.util;

import com.gomoku.common.exception.ErrorCode;
import com.gomoku.common.exception.BaseException;
import com.gomoku.common.exception.BusinessException;
import com.gomoku.common.exception.ValidationException;
import com.gomoku.common.exception.AuthenticationException;
import com.gomoku.common.exception.SystemException;

/**
 * 异常工具类
 * 提供便捷的异常创建方法
 * 
 * @author gomoku
 * @version 1.0.0
 * @since 2024-01-01
 */
public class ExceptionUtil {

    /**
     * 私有构造方法，防止实例化
     */
    private ExceptionUtil() {
        throw new UnsupportedOperationException("ExceptionUtil class cannot be instantiated");
    }

    // ==================== 业务异常 ====================

    /**
     * 抛出用户不存在异常
     * 
     * @param message 错误信息
     */
    public static void throwUserNotFound(String message) {
        throw new BusinessException(ErrorCode.USER_NOT_FOUND, message);
    }

    /**
     * 抛出用户名已存在异常
     * 
     * @param message 错误信息
     */
    public static void throwUsernameExists(String message) {
        throw new BusinessException(ErrorCode.USERNAME_EXISTS, message);
    }

    /**
     * 抛出用户创建失败异常
     * 
     * @param message 错误信息
     */
    public static void throwUserCreateFailed(String message) {
        throw new BusinessException(ErrorCode.USER_CREATE_FAILED, message);
    }

    /**
     * 抛出用户更新失败异常
     * 
     * @param message 错误信息
     */
    public static void throwUserUpdateFailed(String message) {
        throw new BusinessException(ErrorCode.USER_UPDATE_FAILED, message);
    }

    // ==================== 认证异常 ====================

    /**
     * 抛出登录失败异常
     * 
     * @param message 错误信息
     */
    public static void throwLoginFailed(String message) {
        throw new AuthenticationException(ErrorCode.LOGIN_FAILED, message);
    }

    /**
     * 抛出用户名或密码错误异常
     * 
     * @param message 错误信息
     */
    public static void throwLoginCredentialsError(String message) {
        throw new AuthenticationException(ErrorCode.LOGIN_CREDENTIALS_ERROR, message);
    }

    /**
     * 抛出用户未登录异常
     * 
     * @param message 错误信息
     */
    public static void throwUserNotLogin(String message) {
        throw new AuthenticationException(ErrorCode.USER_NOT_LOGIN, message);
    }

    /**
     * 抛出Token无效异常
     * 
     * @param message 错误信息
     */
    public static void throwTokenInvalid(String message) {
        throw new AuthenticationException(ErrorCode.TOKEN_INVALID, message);
    }

    /**
     * 抛出Token过期异常
     * 
     * @param message 错误信息
     */
    public static void throwTokenExpired(String message) {
        throw new AuthenticationException(ErrorCode.TOKEN_EXPIRED, message);
    }

    /**
     * 抛出权限不足异常
     * 
     * @param message 错误信息
     */
    public static void throwPermissionDenied(String message) {
        throw new AuthenticationException(ErrorCode.PERMISSION_DENIED, message);
    }

    // ==================== 参数验证异常 ====================

    /**
     * 抛出参数错误异常
     * 
     * @param message 错误信息
     */
    public static void throwParamError(String message) {
        throw new ValidationException(ErrorCode.PARAM_ERROR, message);
    }

    /**
     * 抛出参数为空异常
     * 
     * @param message 错误信息
     */
    public static void throwParamNull(String message) {
        throw new ValidationException(ErrorCode.PARAM_NULL, message);
    }

    /**
     * 抛出参数格式错误异常
     * 
     * @param message 错误信息
     */
    public static void throwParamFormatError(String message) {
        throw new ValidationException(ErrorCode.PARAM_FORMAT_ERROR, message);
    }

    /**
     * 抛出参数长度错误异常
     * 
     * @param message 错误信息
     */
    public static void throwParamLengthError(String message) {
        throw new ValidationException(ErrorCode.PARAM_LENGTH_ERROR, message);
    }

    // ==================== 积分管理异常 ====================

    /**
     * 抛出积分不足异常
     * 
     * @param message 错误信息
     */
    public static void throwScoreInsufficient(String message) {
        throw new BusinessException(ErrorCode.SCORE_INSUFFICIENT, message);
    }

    /**
     * 抛出积分计算错误异常
     * 
     * @param message 错误信息
     */
    public static void throwScoreCalculateError(String message) {
        throw new BusinessException(ErrorCode.SCORE_CALCULATE_ERROR, message);
    }

    /**
     * 抛出积分更新失败异常
     * 
     * @param message 错误信息
     */
    public static void throwScoreUpdateFailed(String message) {
        throw new BusinessException(ErrorCode.SCORE_UPDATE_FAILED, message);
    }

    // ==================== 匹配系统异常 ====================

    /**
     * 抛出匹配队列已满异常
     * 
     * @param message 错误信息
     */
    public static void throwMatchQueueFull(String message) {
        throw new BusinessException(ErrorCode.MATCH_QUEUE_FULL, message);
    }

    /**
     * 抛出用户已在匹配队列中异常
     * 
     * @param message 错误信息
     */
    public static void throwUserInMatchQueue(String message) {
        throw new BusinessException(ErrorCode.USER_IN_MATCH_QUEUE, message);
    }

    /**
     * 抛出用户不在匹配队列中异常
     * 
     * @param message 错误信息
     */
    public static void throwUserNotInMatchQueue(String message) {
        throw new BusinessException(ErrorCode.USER_NOT_IN_MATCH_QUEUE, message);
    }

    /**
     * 抛出匹配失败异常
     * 
     * @param message 错误信息
     */
    public static void throwMatchFailed(String message) {
        throw new BusinessException(ErrorCode.MATCH_FAILED, message);
    }

    // ==================== 游戏核心异常 ====================

    /**
     * 抛出游戏房间不存在异常
     * 
     * @param message 错误信息
     */
    public static void throwRoomNotFound(String message) {
        throw new BusinessException(ErrorCode.ROOM_NOT_FOUND, message);
    }

    /**
     * 抛出游戏房间已满异常
     * 
     * @param message 错误信息
     */
    public static void throwRoomFull(String message) {
        throw new BusinessException(ErrorCode.ROOM_FULL, message);
    }

    /**
     * 抛出用户不在房间中异常
     * 
     * @param message 错误信息
     */
    public static void throwUserNotInRoom(String message) {
        throw new BusinessException(ErrorCode.USER_NOT_IN_ROOM, message);
    }

    /**
     * 抛出不是当前回合异常
     * 
     * @param message 错误信息
     */
    public static void throwNotCurrentTurn(String message) {
        throw new BusinessException(ErrorCode.NOT_CURRENT_TURN, message);
    }

    /**
     * 抛出落子位置无效异常
     * 
     * @param message 错误信息
     */
    public static void throwInvalidMove(String message) {
        throw new BusinessException(ErrorCode.INVALID_MOVE, message);
    }

    /**
     * 抛出落子位置已有棋子异常
     * 
     * @param message 错误信息
     */
    public static void throwPositionOccupied(String message) {
        throw new BusinessException(ErrorCode.POSITION_OCCUPIED, message);
    }

    /**
     * 抛出游戏已结束异常
     * 
     * @param message 错误信息
     */
    public static void throwGameEnded(String message) {
        throw new BusinessException(ErrorCode.GAME_ENDED, message);
    }

    // ==================== 系统异常 ====================

    /**
     * 抛出系统错误异常
     * 
     * @param message 错误信息
     */
    public static void throwSystemError(String message) {
        throw new SystemException(ErrorCode.SYSTEM_ERROR, message);
    }

    /**
     * 抛出数据库操作失败异常
     * 
     * @param message 错误信息
     */
    public static void throwDatabaseOperationFailed(String message) {
        throw new SystemException(ErrorCode.DATABASE_OPERATION_FAILED, message);
    }

    /**
     * 抛出Redis操作失败异常
     * 
     * @param message 错误信息
     */
    public static void throwRedisOperationFailed(String message) {
        throw new SystemException(ErrorCode.REDIS_OPERATION_FAILED, message);
    }

    // ==================== 通用方法 ====================

    /**
     * 抛出业务异常
     * 
     * @param errorCode 错误码
     * @param message 错误信息
     */
    public static void throwBusinessException(String errorCode, String message) {
        throw new BusinessException(errorCode, message);
    }

    /**
     * 抛出验证异常
     * 
     * @param errorCode 错误码
     * @param message 错误信息
     */
    public static void throwValidationException(String errorCode, String message) {
        throw new ValidationException(errorCode, message);
    }

    /**
     * 抛出认证异常
     * 
     * @param errorCode 错误码
     * @param message 错误信息
     */
    public static void throwAuthenticationException(String errorCode, String message) {
        throw new AuthenticationException(errorCode, message);
    }

    /**
     * 抛出系统异常
     * 
     * @param errorCode 错误码
     * @param message 错误信息
     */
    public static void throwSystemException(String errorCode, String message) {
        throw new SystemException(errorCode, message);
    }

    /**
     * 抛出基础异常
     * 
     * @param errorCode 错误码
     * @param message 错误信息
     */
    public static void throwBaseException(String errorCode, String message) {
        throw new BaseException(errorCode, message);
    }
}
